package com.newly.common.base.entity;

import com.newly.common.base.constants.CodeConstant;
import lombok.Data;

import java.io.Serializable;

/**
 * 封装响应数据
 *
 * @author guan
 */
@Data
public class R<T> implements Serializable {
    private Integer code;   // 状态码
    private T data;         // 数据
    private String msg;     // 返回消息

    private static final long serialVersionUID = -1;

    public R() {
    }

    public R(Integer code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    public R(Integer code, T data) {
        this.code = code;
        this.data = data;
    }

    public R(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public R(T data, String msg) {
        this.code = CodeConstant.SUCCESS;
        this.data = data;
        this.msg = msg;
    }

    /**
     * 成功响应返回
     *
     * @param code 状态码
     * @param data 数据
     * @param msg  消息
     */
    public static <D> R<D> ok(Integer code, D data, String msg) {
        return new R<D>(code, data, msg);
    }

    /**
     * 成功响应返回
     *
     * @param data 数据
     * @param msg  消息
     */
    public static <D> R<D> ok(D data, String msg) {
        return new R<D>(data, msg);
    }

    /**
     * 成功响应返回，带状态码、数据,不带消息
     *
     * @param code 状态码
     * @param data 数据
     */
    public static <D> R<D> ok(Integer code, D data) {
        return new R<D>(code, data);
    }

    /**
     * 成功响应返回，自带状态码(200)、数据,不带消息
     *
     * @param data 数据
     */
    public static <D> R<D> ok(D data) {
        return new R<D>(CodeConstant.SUCCESS, data, "success");
    }


    /**
     * 失败返回,带状态码、数据、消息
     *
     * @param code 状态码
     * @param data 数据
     * @param msg  消息
     */
    public static <D> R<D> fail(Integer code, D data, String msg) {
        return new R<D>(code, data, msg);
    }

    /**
     * 失败返回,带状态码、消息，不带数据
     *
     * @param code 状态码
     * @param msg  消息
     */
    public static <D> R<D> fail(Integer code, String msg) {
        return new R<D>(code, msg);
    }

    /**
     * 失败返回,自带状态码(500)、消息，不带数据
     *
     * @param msg 消息
     */
    public static <D> R<D> fail(String msg) {
        return new R<D>(CodeConstant.FAILED, msg);
    }

    public static <D> R<D> ok() {
        return new R<D>(CodeConstant.SUCCESS, "请求成功");
    }


}
